package monpkg.entities;

import java.io.Serializable;
import java.rmi.Remote;
import java.util.Date;
import java.util.Set;

import javax.persistence.Basic;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Embedded;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.OneToMany;
import javax.persistence.PostUpdate;
import javax.persistence.PreUpdate;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.persistence.Transient;
import javax.persistence.Version;

/**
 * @author Yannick Bouchot
 * @author Jonathan Romero
 */
@SuppressWarnings("unused")
@Entity(name = "Student")
// Requête en JPA/QL qui ressemble à du SQL mais qui manipule les objets Java
@NamedQueries({ @NamedQuery(name = "findAllStudentsWithName", query = "SELECT s FROM Student s") })
public class Student implements Serializable, Remote {

	private static final long serialVersionUID = 1L;

	@Id()
	@GeneratedValue(strategy = GenerationType.AUTO)
	private long id;

	@Basic(optional = false)
	@Column(name = "first_name", length = 200, nullable = false, unique = false)
	private String firstName;

	@Basic(optional = false)
	@Column(name = "name", length = 200, nullable = false, unique = false)
	private String name;

	@Basic(optional = false)
	@Column(name = "password", length = 200, nullable = false, unique = false)
	private String password;

	@Basic(optional = false)
	@Column(name = "mail", length = 500, nullable = false, unique = false)
	private String mail;

	@Basic()
	@Column(name = "web_site", length = 1000, nullable = true, unique = false)
	private String webSite;

	@Basic()
	@Column(name = "company_name", length = 2000, nullable = true, unique = false)
	private String companyName;

	@Basic()
	@Column(name = "company_site_web", length = 1000, nullable = true, unique = false)
	private String companySiteWeb;

	@Embedded
	private Address address;

	@Basic()
	@Temporal(TemporalType.DATE)
	@Column(name = "birth_day")
	private Date birthDay;

	@Version()
	private long version = 0;
	/**
	 * variable permettant de mettre a jour le compteur
	 */
	@Transient
	public static long updateCounter = 0;

	/**
	 * methode permettant la creation d'un etudiant
	 */
	public Student() {
		super();
	}

	/**
	 * methode permettant la creation d'un etudiant avec tout ses parametres
	 */
	public Student(String firstName, String name, String mail, String password) {
		super();
		setFirstName(firstName);
		setName(name);
		setMail(mail);
		setPassword(password);
	}

	@PreUpdate
	public void beforeUpdate() {
		System.err.println("PreUpdate of " + this);
	}

	@PostUpdate
	public void afterUpdate() {
		System.err.println("PostUpdate of " + this);
		updateCounter++;
	}

	@Override
	public String toString() {
		return "Student(id=" + getId() + "," + firstName + "," + name + ","
				+ mail + "," + ",v" + getVersion() + ")";
	}

	/**
	 * methode permettant de recuperer une adresse
	 */
	@OneToMany(cascade = { CascadeType.MERGE, CascadeType.PERSIST }, fetch = FetchType.LAZY, mappedBy = "owner")
	public Address getAddress() {
		return address;
	}

	/**
	 * methode permettant de definir une adresse
	 */
	public void setAddress(Address address) {
		this.address = address;
	}

	/**
	 * methode permattant de recuperer l'id de l'etudiant
	 */
	public long getId() {
		return id;
	}

	/**
	 * methode permettant de definir l'id de l'etudiant
	 */
	public void setId(long id) {
		this.id = id;
	}

	/**
	 * methode permattant de recuperer le prenom de l'etudiant
	 */
	public String getFirstName() {
		return firstName;
	}

	/**
	 * methode permettant de definir le prenom de l'etudiant
	 */
	public void setFirstName(String firstName) {
		this.firstName = firstName;
	}

	/**
	 * methode permattant de recuperer le nom de l'etudiant
	 */
	public String getName() {
		return name;
	}

	/**
	 * methode permettant de definir le nom de l'etudiant
	 */
	public void setName(String name) {
		this.name = name;
	}

	/**
	 * methode permattant de recuperer le mot de passe de l'etudiant
	 */
	public String getPassword() {
		return password;
	}

	/**
	 * methode permettant de definir le mot de passe de l'etudiant
	 */
	public void setPassword(String password) {
		this.password = password;
	}

	/**
	 * methode permattant de recuperer l'adresse mail de l'etudiant
	 */
	public String getMail() {
		return mail;
	}

	/**
	 * methode permettant de definir l'adresse mail de l'etudiant
	 */
	public void setMail(String mail) {
		this.mail = mail;
	}

	/**
	 * methode permattant de recuperer l'adresse du site web de l'etudiant
	 */
	public String getWebSite() {
		return webSite;
	}

	/**
	 * methode permettant de definir l'adresse du site web de l'etudiant
	 */
	public void setWebSite(String webSite) {
		this.webSite = webSite;
	}

	/**
	 * methode permattant de recuperer le nom de la compagnie embauchant
	 * l'etudiant
	 */
	public String getCompanyName() {
		return companyName;
	}

	/**
	 * methode permettant de definir le nom de la compagnie embauchant
	 * l'etudiant
	 */
	public void setCompanyName(String companyName) {
		this.companyName = companyName;
	}

	/**
	 * methode permattant de recuperer le site web de la compagnie embauchant
	 * l'etudiant
	 */
	public String getCompanySiteWeb() {
		return companySiteWeb;
	}

	/**
	 * methode permettant de definir le site web de la compagnie embauchant
	 * l'etudiant
	 */
	public void setCompanySiteWeb(String companySiteWeb) {
		this.companySiteWeb = companySiteWeb;
	}

	/**
	 * methode permattant de recuperer la date d'anniversaire de l'etudiant
	 */
	public Date getBirthDay() {
		return birthDay;
	}

	/**
	 * methode permettant de definir la date d'anniversaire de l'etudiant
	 */
	public void setBirthDay(Date birthDay) {
		this.birthDay = birthDay;
	}

	/**
	 * methode permattant de recuperer la version de l'etudiant dans la base de
	 * donnes
	 */
	public long getVersion() {
		return version;
	}

	/**
	 * methode permettant de definir la version de l'etudiant dans la base de
	 * donnes
	 */
	public void setVersion(long version) {
		this.version = version;
	}
}